Exercícios Conceituais sobre Linguagens de Programação

Capítulo 1 - Introdução

  1. Explique como as propriedades de legibilidade e redigibilidade podem entrar em conflito em linguagens de programação. Dê exemplos concretos.
    • Legibilidade: Facilidade de entender o código por humanos
    • Redigibilidade: Facilidade de escrever o código
    • Conflito: Linguagens muito concisas (como Perl) podem ser difíceis de ler
    • Exemplo: Operadores ternários vs if-else
  2. Compare os métodos de implementação de linguagens por compilação, interpretação e híbrido em termos de:
    • Eficiência de execução: Compilação > Híbrido > Interpretação
    • Portabilidade: Interpretação > Híbrido > Compilação
    • Facilidade de depuração: Interpretação > Híbrido > Compilação
  3. Analise criticamente a evolução das linguagens de programação, identificando como as necessidades do mercado influenciaram seu desenvolvimento.
    • Era do Mainframe: Fortran, COBOL
    • Era do PC: C, Pascal
    • Era da Web: JavaScript, PHP
    • Era Mobile: Swift, Kotlin
    • Era Cloud: Go, Rust
  4. Discuta por que a ortogonalidade é uma propriedade desejável em linguagens de programação e como sua ausência pode afetar o aprendizado.
    • Ortogonalidade: Independência entre características da linguagem
    • Vantagens: Menos exceções, mais previsibilidade
    • Exemplo: Python vs C++ em termos de ortogonalidade

Capítulo 2 - Amarrações

  1. Compare o escopo estático e dinâmico, analisando:
    • Impacto na legibilidade: Escopo estático é mais previsível
    • Eficiência de execução: Escopo estático é mais eficiente
    • Facilidade de manutenção: Escopo estático facilita a manutenção
  2. Explique como diferentes tempos de amarração afetam:
    • Flexibilidade da linguagem: Amarração tardia = mais flexibilidade
    • Eficiência de execução: Amarração antecipada = mais eficiência
    • Detecção de erros: Amarração antecipada = erros detectados mais cedo
  3. Discuta as vantagens e desvantagens de permitir definições e declarações em qualquer ponto do bloco versus exigir que sejam feitas no início.
    • Vantagens: Flexibilidade, código mais natural
    • Desvantagens: Pode dificultar a leitura, possibilidade de erros
  4. Analise o impacto das diferentes estruturas de blocos (monolítica, não aninhada e aninhada) na modularização de programas.
    • Monolítica: C, mais simples mas menos flexível
    • Não aninhada: Python, mais clara e previsível
    • Aninhada: JavaScript, mais flexível mas pode ser confusa

Capítulo 3 - Valores e Tipos de Dados

  1. Compare as abordagens de C/C++ e Java quanto à definição dos intervalos de tipos primitivos. Discuta implicações para:
    • Portabilidade: Java é mais portável (tamanhos fixos)
    • Eficiência: C/C++ pode ser mais eficiente (otimizado para hardware)
    • Facilidade de uso: Java é mais seguro e previsível
  2. Analise os diferentes tipos de implementação de strings:
    • Estática: Tamanho fixo (C), eficiente mas limitado
    • Dinâmica limitada: Tamanho variável com limite (Pascal)
    • Dinâmica: Tamanho totalmente variável (Python, Java)
    • Casos de uso: Estática para buffers fixos, dinâmica para texto geral
  3. Discuta os problemas potenciais do uso de ponteiros e como diferentes linguagens lidam com eles:
    • Objetos pendentes: Referências a memória liberada
    • Referências pendentes: Ponteiros inválidos
    • Violação do sistema de tipos: Type casting inseguro
    • Soluções: Garbage collection, smart pointers, referências seguras
  4. Compare as abordagens de diferentes linguagens para tipos compostos em termos de:
    • Flexibilidade: Estruturas vs Classes vs Records
    • Segurança: Verificação de tipos em tempo de compilação
    • Eficiência: Layout de memória e otimizações

Capítulo 4 - Variáveis e Constantes

  1. Compare as diferentes abordagens para gerenciamento de memória:
    • Gerenciamento manual (C/C++):
      • Vantagens: Controle total, eficiência
      • Desvantagens: Erros comuns, complexidade
    • Coleta de lixo automática (Java):
      • Vantagens: Segurança, simplicidade
      • Desvantagens: Overhead, imprevisibilidade
  2. Discuta as implicações de diferentes modelos de persistência de dados:
    • Arquivos: Simples, mas limitado
    • Interfaces com banco de dados: Robusto, mas complexo
    • Persistência ortogonal: Transparente, mas pode ser ineficiente
  3. Analise como diferentes linguagens implementam a pilha de registros de ativação e suas implicações para:
    • Recursão: Profundidade máxima da pilha
    • Escopo de variáveis: Acesso a variáveis locais
    • Eficiência: Custo de chamadas de função
  4. Compare diferentes abordagens para serialização de objetos em termos de:
    • Facilidade de uso: APIs intuitivas vs complexas
    • Portabilidade: Formato independente de plataforma
    • Manutenção: Compatibilidade com versões anteriores
Back to top